<!DOCTYPE html>
<html>
  <head>
    <title>Mixed-Audio Loop Benchmark</title>
    <style>* { font-family: monospace; }</style>
  </head>
  <body>
    <h1>Mixed-Audio Loop Benchmark </h1>
    <p>
      Benchmark measuring how fast we can continuously repeat a short sound
      clip, while another clip is running in the background. In the ideal
      scenario we'd have zero latency processing script, seeking back to the
      beginning of the clip, and resuming audio playback.
    </p>

    <button onclick="startTest();">Start</button>

    <p>
      Times Played: <span id="times"></span></span><br>
      Clip Duration: <span id="clip"></span></span><br>
      Ideal Duration: <span id="ideal"></span><br>
      Actual Duration: <span id="actual"></span><br>
      Average Latency: <span id="average"></span><br>
    </p>

    <script>
      // Total time to run the the test is approximately:
      // TIMES x (shortclip_duration + latency) =~ 50 x (140 + 50) = 9500ms.
      // The background clip should last long enough till the test is finished.
      // So a 20sec background clip should be sufficient.
      var TIMES = 50, averageLatency = 0;

      function getAndClearElement(id) {
        var elem = document.getElementById(id);
        elem.innerText = '';
        return elem;
      }

      function startTest() {
        var timesElem = getAndClearElement('times');
        var clipElem = getAndClearElement('clip');
        var idealElem = getAndClearElement('ideal');
        var actualElem = getAndClearElement('actual');
        var averageElem = getAndClearElement('average');
        var buttonElem = document.querySelector('button');

        var loopCount = 0, idealDuration = 0, actualDuration = 0;
        var startTime;

        buttonElem.disabled = true;

        function onLoaded() {
          idealDuration = Math.round(audio.duration * TIMES * 1000, 0);
          idealElem.innerText =  idealDuration + ' ms';
          clipElem.innerText = Math.round(audio.duration * 1000, 0) + ' ms';
          audio.addEventListener('seeked', onLoop);
          startTime = window.performance.now();
          audio.play();
        }

        startBackgroundClip();
        var audio = document.createElement('audio');
        audio.addEventListener('canplaythrough', onLoaded);
        audio.loop = true;
        audio.src = '../pink_noise_140ms.wav';

        function onLoop() {
          ++loopCount;
          timesElem.innerText = loopCount + '/' + TIMES;
          if (loopCount == TIMES) {
            actualDuration = window.performance.now() - startTime;
            actualElem.innerText = actualDuration + ' ms';
            buttonElem.disabled = false;

            averageLatency = (actualDuration - idealDuration) / loopCount;
            averageElem.innerText = averageLatency + ' ms';

            // Let the PyAuto test know we're done testing.
            if (window.domAutomationController)
              window.domAutomationController.send(true);

            audio.pause();
          }
        }
      }

      function startBackgroundClip() {
        var audio = document.createElement('audio');
        audio.src = '../avperf/pink_noise_20s.wav';
        audio.play();
      }
    </script>
  </body>
</html>
